#ifndef DATABASEMANAGER_H
#define DATABASEMANAGER_H

#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QVariant>
#include <QMap>
#include <QPair>

class DatabaseManager : public QObject
{
    Q_OBJECT

private:
    // 私有构造函数，防止外部直接创建实例
    explicit DatabaseManager(QObject *parent = nullptr);
    // 静态实例指针
    static DatabaseManager* s_instance;
    // 数据库连接
    QSqlDatabase m_db;
    // 当前被试ID
    int m_currentSubjectId;

public:
    // 单例模式的获取实例方法
    static DatabaseManager* getInstance();
    // 单例模式的销毁实例方法
    static void destroyInstance();
    ~DatabaseManager();
    // 初始化数据库
    bool init(const QString &dbFile);
    // 创建数据表
    bool createTables();
    //获取所有被试
    QList<QVariantList> getAllSubjects();
    // 添加被试
    void addSubject(const QString &name, const QString &gender, int age, const QMap<QString, QString> &optionalData = QMap<QString, QString>());
    // 插入GSR数据
    void insertGsrData(double value1, double value2, qint64 timestamp = 0);

    // 插入EEG数据，返回插入记录的ID
    int insertEegData(double fp1, double fpz, double fp2, qint64 timestamp = 0);

    // 插入EEG原始数据
    void insertEegRawData(double fp1, double fpz, double fp2, qint64 timestamp, int filteredDataId);

    // 插入ECG数据，返回插入记录的ID
    int insertEcgData(const QVector<double> &values, int channelIndex, qint64 timestamp = 0);

    // 插入ECG原始数据
    void insertEcgRawData(const QVector<double> &values, qint64 timestamp, int filteredDataId);

    // 记录聊天事件
    void logChatEvent(const QString &message, const QString &role);

    // 记录音频事件
    void logAudioEvent(const QString &event, qint64 timestamp);

    // 记录分析事件
    void logAnalysisEvent(const QString &params);

    // 获取聊天历史
    QList<QPair<QString, QString>> getChatHistory(int limit = 100);

    // 设置当前被试ID
    void setCurrentSubjectId(int id) { m_currentSubjectId = id; }

    // 获取当前被试ID
    int getCurrentSubjectId() const { return m_currentSubjectId; }

    QSqlDatabase getDatabase() const { return m_db; }

signals:
    // 被试列表变化信号
    void subjectListChanged(const QList<QVariantList> &subjects);
};

#endif // DATABASEMANAGER_H
